#include <stdio.h>
#include <sys/types.h>      
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include "lcd.h"
#include <stdlib.h>

#define size 800*480*4

int fd=-1;
int *plcd=NULL;

//LCD屏幕的初始化
int lcd_init()
{
    fd = open("/dev/fb0",O_RDWR);
	if(fd==-1)
	{
		perror("open fb0 error");//打印错误信息
		return -1;
	}
    plcd=mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);

}
//关闭屏幕
void lcd_close()
{
    int flag=munmap(plcd,size);
    if(flag==-1)
    {
        perror("close mmap error");
    }
    close(fd);
}
//画点 
void display_point( int x, int y, int color )
{
    if( x>=0 && x<800 && y>=0 && y<480 )
    {
         *( plcd + y*800 + x ) = color;
    }
}
//显示一张纯色的图片
void show_a_color(int color)
{
    for(int i=0;i<480;i++)
    {
        for(int j=0;j<800;j++)
        {
            display_point(j,i,color);
        }
    }
}

//显示一个长方形
void show_a_rectangle(int x,int y,int w,int h,int color)
{
    for(int i=0;i<480;i++)
    {
        for(int j=0;j<800;j++)
        {
            if(i>=y&&i<=y+h&&j>=x&&j<=x+w)
            {
                display_point(j,i,color);
            }
            
        }
    }
}

//显示一个圆形
void show_a_circle(int x,int y,int l,int color)
{
    for(int i=0;i<480;i++)
    {
        for(int j=0;j<800;j++)
        {
            if((i-y)*(i-y)+(j-x)*(j-x)<=l*l)
            {
                display_point(j,i,color);
            }
        }
    }
}
//显示一个正三角形
void show_a_triangle(int x,int y,int l,int color)
{
    for(int i=0;i<480;i++)
    {
        for(int j=0;j<800;j++)
        {
            if((i+0.5*(j-l/2))>=(y+0.5*(x-l/2)) && (i-0.5*(j+l/2))>=(y-0.5*(x+l/2)) && i>=200)
            {
                display_point(j,i,color);
            }
        }
    }
}

void lcd_init0()
{
	fd = open("/dev/fb0", O_RDWR);
	if (fd == -1)
	{
		perror("open fb0 error");
		exit(1);
	}
	plcd = mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	if (plcd == MAP_FAILED)
	{
		perror("mmap lcd error");
		exit(1);
	}
	printf("lcd init success!\n");
}

void lcd_draw_point(int x, int y, int color)
{
	*(plcd + 800 * y + x) = color;
}

void lcd_draw_rgb888(char *rgb888, int width, int height, int x, int y)
{
	int i, j;
	char r, g, b;
	int color;
	char *p = rgb888;
	for (i = 0; i < height; ++i)
	{
		for (j = 0; j < width; ++j)
		{
			b = *p++;
			g = *p++;
			r = *p++;
			color = r << 16 | g << 8 | b;
			lcd_draw_point(j + x, i + y, color);
		}
	}
}

void lcd_uninit()
{
	munmap(plcd, 800 * 480 * 4);
	close(fd);
	printf("lcd_uninit!\n");
}